package com.sky.testmodule.controller.redis;

import com.sky.testmodule.constant.TestConstant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author zhiwei Liao
 * @version 1.0
 * @Description
 * @Date 2021/8/13 9:47
 */
@RequestMapping("/hash")
@RestController
public class HashController {

    @Autowired
    RedisTemplate redisTemplate;


    @GetMapping("/hashCache")
    public void hashCache(){
        //单值存储
        redisTemplate.opsForHash().put(TestConstant.KEY_TEST,TestConstant.KEY_TEST + System.currentTimeMillis(),System.currentTimeMillis());
        //单个对象存储
        redisTemplate.opsForHash().put(TestConstant.KEY_TEST,TestConstant.OBJECT_CACHE_KEY + System.currentTimeMillis(),new Object());
        //获取变量中的键值对
        redisTemplate.opsForHash().entries(TestConstant.KEY_TEST);
        //获取变量中的指定map键是否有值,如果存在该map键则获取值，没有则返回null。
        redisTemplate.opsForHash().get(TestConstant.KEY_TEST,TestConstant.OBJECT_CACHE_KEY + System.currentTimeMillis());
        //判断变量中是否有指定的map键
        redisTemplate.opsForHash().hasKey(TestConstant.KEY_TEST,TestConstant.OBJECT_CACHE_KEY + System.currentTimeMillis());
        //获取变量中的键
        redisTemplate.opsForHash().keys(TestConstant.KEY_TEST);
        //获取变量的长度
        redisTemplate.opsForHash().size(TestConstant.KEY_TEST);
        //获取对象缓存
        redisTemplate.opsForHash().values(TestConstant.OBJECT_CACHE_KEY + System.currentTimeMillis());
        //使变量中的键以long值的大小进行自增长,变量中的键以值的大小进行自增长
        redisTemplate.opsForHash().increment(TestConstant.KEY_TEST,TestConstant.OBJECT_CACHE_KEY + System.currentTimeMillis(),5);
        //如果hashKey存在，啥也不操作，如果hashKey不存在，则新增
        redisTemplate.opsForHash().putIfAbsent(TestConstant.KEY_TEST,TestConstant.OBJECT_CACHE_KEY + System.currentTimeMillis(),new Object());
        //	删除变量中的键值对，可以传入多个参数，删除多个键值对。
        redisTemplate.opsForHash().delete(TestConstant.KEY_TEST,TestConstant.OBJECT_CACHE_KEY + System.currentTimeMillis());
        //以map集合的形式添加键值对
        Map newMap = new HashMap();
        newMap.put("map3","map3-3");
        newMap.put("map5","map5-5");
        redisTemplate.opsForHash().putAll(TestConstant.KEY_TEST,newMap);
        //以集合的方式获取变量中的值。
        List<Object> list = new ArrayList<Object>();
        list.add("map1");
        list.add("map2");
        redisTemplate.opsForHash().multiGet(TestConstant.KEY_TEST,list);
        //匹配获取键值对，ScanOptions.NONE为获取全部键对，ScanOptions.scanOptions().match("map1").build()     匹配获取键位map1的键值对,不能模糊匹配。
        Cursor<Map.Entry<Object,Object>> cursor = redisTemplate.opsForHash().scan(TestConstant.KEY_TEST,ScanOptions.scanOptions().match("map1").build());//Cursor<Map.Entry<Object,Object>> cursor = redisTemplate.opsForHash().scan("hashValue",ScanOptions.NONE);
        while (cursor.hasNext()){
            Map.Entry<Object,Object> entry = cursor.next();
            System.out.println("通过scan(H key, ScanOptions options)方法获取匹配键值对:" + entry.getKey() + "---->" + entry.getValue());
        }
    }



}
